/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.foxline.service;

import br.com.foxline.model.Users;
import br.com.foxline.util.Msg;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.Stateless;
import javax.faces.context.FacesContext;
import javax.persistence.Query;

/**
 *
 * @author ely
 */
@Stateless
public class UserService extends GenericService<Users> {

    public UserService() {
        super(Users.class);
    }
  
    
     /**
     * Retorna o Login do Usuario logado.
     *
     * @return
     */
    public String getCurrentUser() {
        String u = "";
        try {
            FacesContext ctx = FacesContext.getCurrentInstance();
            u = ctx.getExternalContext().getRemoteUser();
        } catch (Exception e) {
        }
        return u;
    }
    
    public void saveUser(String confirm, Users user) {
        try {
            if (checkUserName(user)) {
                if (compareToPassword(confirm, user)) {
                    user.setPassword(Users.encryptPassword(user.getPassword()));

                    save(user);
                    Msg.messagemInfo("Usuário Cadastrado com Sucesso ");
                } else {
                    Msg.messagemError("Senhas não conferem");
                }
            } else {
                Msg.messagemError("O campo nome é obrigatório");
            }
        } catch (Exception erro) {
        }
    }

    public void updateUser(String confirm, String passwordOld, String passwordNew, Users user) {
        try {

            if (checkUserPassword(passwordOld, user)) {
                if (compareToPassword(confirm, passwordNew)) {
                    user.setPassword(Users.encryptPassword(passwordNew));
                    Msg.messagemInfo("Usuário Atualizado com Sucesso");
                    update(user);
                } else {
                    Msg.messagemError("Senhas não conferem");
                }

            } else {
                Msg.messagemError("Senha antiga não confere");
            }
        } catch (Exception erro) {
        }

    }

    public void updateAcess(Users user) {
        try {
            update(user);
            Msg.messagemInfo("Nível de Acesso Atualizado com Sucesso");
        } catch (Exception erro) {
        }
    }

    /**
     * Compara senha do usuário
     *
     * @param comparasenha
     * @param usuario
     * @return
     */
    public boolean compareToPassword(String confirm, Users user) {
        boolean b;
        if (user.getPassword().equals(confirm)) {
            b = true;
        } else {
            b = false;
        }
        return b;
    }
    
    public Users getCurrentUserFull(){
        return userByLoginName(getCurrentUser());
    }

    public boolean compareToPassword(String confirm, String passwordNew) {
        boolean b;
        if (passwordNew.equals(confirm)) {
            b = true;
        } else {
            b = false;
        }
        return b;
    }

    /**
     * verifica se o campo name está vazio
     *
     * @param verificacampo
     * @return
     */
    public boolean checkUserName(Users user) {
        boolean b;
        if (!user.getName().equals("")) {
            b = true;
        } else {
            b = false;
        }
        return b;
    }

    /**
     * Compara senha Cripitografada (Senha antiga)
     *
     * @param compara senha
     * @param cripitografia
     * @return
     */
    public boolean checkUserPassword(String senha, Users user) {
        boolean b;
        String s = Users.encryptPassword(senha);
        if (s.equals(user.getPassword())) {
            b = true;
        } else {
            b = false;
        }
        return b;
    }

    /**
     * Pesquisar Usuário
     *
     * @param pesquisarUsuario
     * @return
     */
    public List<Users> findUsers(Users user) {
        String sql = "select u from Users u ";

        if ((!user.getName().equals("")) && (user.getName() != null)) {
            sql += "  WHERE lower(u.name) like lower(:name)  ";
        }
        Query query = getEntityManager().createQuery(sql);

        if ((!user.getName().equals("")) && (user.getName() != null)) {
            query.setParameter("name", "%" + user.getName() + "%");
        }
        return query.getResultList();
    }

    public List<Users> autocomplete(String name) {
        List<Users> lista = new ArrayList<Users>();
        String sql = "Select u from Users u where lower(u.name) like lower(:name)";
        Query query = getEntityManager().createQuery(sql).setMaxResults(50);
        if (name != null) {
            query.setParameter("name", "" + name + "%");
        }
        lista = query.getResultList();
        return lista;
    }

    public Users userByLoginName(String name) {
        Users u = new Users();
        String sql = "select u from Users u where lower(u.login)=lower(:name)";
        Query query = getEntityManager().createQuery(sql);
        if (name != null) {
            query.setParameter("name", name);
        }
        try {
            u = (Users) query.getSingleResult();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return u;
    }
}
